package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.events.MouseEvent;
import flash.system.Security;

import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.protocol.TBinaryProtocol;

/**
 * Simple interface and connection logic implementation for tutorial.
 */
public class Main extends Sprite {
    public static const BUTTON_PADDING:uint = 5;

    private var mCalculatorClient:Calculator; // we use calculator through interface
    private var mTransport:TTransport; // Transport, used to comunicate with server

    private var mAddButton:Sprite;
    private var mLeft:TextField;
    private var mRight:TextField;
    private var mResult:TextField;

    private var pingButton:Sprite;

//    public function Main() {
//        var textField:TextField = new TextField();
//        textField.text = "Hello, World";
//        addChild(textField);
//    }


    public function Main() {
        buildInterface();
       // initSecurity();
        initConnection();
    }

    private function initSecurity():void {
        Security.loadPolicyFile("xmlsocket://127.0.0.1:9092");
    }

    /**
     * Example of initializing connection.
     */
    private function initConnection():void {
        mTransport = new TSocket("127.0.0.1", 9090); // we connect to server
        mTransport.open();
        // initialize protocol:
        var protocol:TProtocol = new TBinaryProtocol(mTransport, false, false);
        mCalculatorClient = new CalculatorImpl(protocol); // finally, we create calculator client instance
    }



    private function onPingClick(me:MouseEvent):void {
        if(!mTransport.isOpen()) return;
        mCalculatorClient.ping(onPingError, onPingSuccess);
    }

    private function onPingError(error:Error):void {
        trace("Error, while requesting ping.");
        throw error;
    }

    private function onPingSuccess():void {
        trace("Ping returned successfully");
    }

    private function onAddClick(me:MouseEvent):void {
        if(!mTransport.isOpen()) return;
        var num1:Number = Number(mLeft.text);
        var num2:Number = Number(mRight.text);
        mResult.text = "Processing...";
        mCalculatorClient.add(num1, num2, onAddError, onAddSuccess);
    }

    private function onAddError(error:Error):void {
        trace("Error, while requesting add.");
        throw error;
    }

    private function onAddSuccess(res:Number):void {
        mResult.text = String(res);
    }

    private function buildInterface():void {
        addChild(pingButton = buildButton("PING"));
        pingButton.x = (stage.stageWidth - pingButton.width) / 2;
        pingButton.y = 10;
        pingButton.addEventListener(MouseEvent.CLICK, onPingClick);

        var top:Number = pingButton.y + pingButton.height + 20;
        addChild(mLeft = buildDigitInput());
        mLeft.x = 15;
        mLeft.y = top + BUTTON_PADDING;
        addChild(mRight = buildDigitInput());
        mRight.x = mLeft.x + mLeft.width + 15;
        mRight.y = top + BUTTON_PADDING;
        addChild(mAddButton = buildButton("ADD"));
        mAddButton.x = mRight.x + mRight.width + 15;
        mAddButton.y = top;
        mAddButton.addEventListener(MouseEvent.CLICK, onAddClick);
        addChild(mResult = buildDigitInput());
        mResult.x = mAddButton.x + mAddButton.width + 15;
        mResult.y = top + BUTTON_PADDING;
    }

    /**
     * Simple digit-only input field.
     */
    private function buildDigitInput():TextField {
        var textField:TextField = new TextField;
        textField.width = 75;
        textField.height = 20;
        textField.restrict = "0987654321.";
        textField.type = TextFieldType.INPUT;
        textField.background = true;
        textField.backgroundColor = 0xaaaaff;
        textField.textColor = 0xffff00;
        return textField;
    }

    /**
     * Simple button drawing.
     */
    private function buildButton(text:String):Sprite {
        var button:Sprite = new Sprite;
        var textField:TextField = new TextField;
        textField.width = 4000;
        textField.text = text;
        textField.textColor = 0xffff00;
        textField.width = textField.textWidth + 4;
        textField.height = textField.textHeight + 4;
        textField.mouseEnabled = false;
        button.graphics.beginFill(0x0000ff);
        button.graphics.lineStyle(0, 0x000000);
        button.graphics.drawRoundRect(0, 0, textField.width + BUTTON_PADDING * 2,
                textField.height + BUTTON_PADDING * 2, BUTTON_PADDING);
        button.graphics.endFill();
        button.addChild(textField);
        textField.x = BUTTON_PADDING;
        textField.y = BUTTON_PADDING;
        button.useHandCursor = button.buttonMode = true;
        return button;
    }
}
}